package com.tom.architect.party3.day31;

/**
 * 静态代理的包裹类。
 * @param <T>
 * @param <R>
 */
public class ObservableMap<T, R> extends Observable<R> {
    final Observable<T> source; // 前面的Observable，指向前一个对象
    final Function<T, R> function; // 当前转换

    public ObservableMap(Observable<T> source, Function<T, R> function) {
        this.source = source;
        this.function = function;
    }

    @Override
    protected void subscribeActual(Observer<R> observer) {
        // 第一步：订阅 ******
        // 对observer包裹了一层，静态代理包裹。 source永远是上游的Observable 对象。
        // observer 代表下游给我们封装好的Observer 观察者对象。
        source.subscribe(new MapObserver<>(observer, function));
    }

    private class MapObserver<T> implements Observer<T> {
        final Observer<R> observer;
        final Function<T, R> function;

        public MapObserver(Observer<R> source, Function<T, R> function) {
            this.observer = source;
            this.function = function;
        }

        @Override
        public void onSubscribe() {
            observer.onSubscribe();
        }

        @Override
        public void onNext(T item) {
            // 要去转换。string-> Bitmap
            // 第四步：function.apply 调用apply方法。
            try {
                R applyR = function.apply(item);
                // 第六步：调用onNext方法
                // 将bitmap 传出去显示
                observer.onNext(applyR);
            } catch (Exception e) {
                observer.onError(e);
            }
        }

        @Override
        public void onError(Throwable e) {
            observer.onError(e);
        }

        @Override
        public void onComplete() {
            observer.onComplete();
        }
    }
}
